package thread;

/**
 * 创建线程-继承 Thread类
 * class 类名 extends Thread {
 *
 *     重写run()
 * }
 */
public class Thread01 {

    public static void main(String[] args) throws InterruptedException {

        /*
            java中创建线程有两种方式
            1)继承Thread类 重写 run 方法
            2)实现Runnable接口 重写 run 方法

            例：
            开启一个线程，该线程每隔1秒，在控制台输出 "喵喵 我是小猫咪"
            当输出80次，结束该线程
         */

        Cat cat = new Cat();

        /*
             public synchronized void start() {
                start0();
             }

             start0() 是本地方法，是JVM调用, 底层是c/c++实现
             真正实现多线程的效果， 是start0(), 而不是 run
         */
        cat.start();//启动线程，最终会执行cat的run方法
        //start 方法调用  start0() 后，该线程不一定会立马执行，只是将线程变成了可运行状态。具体执行时间由CPU调度

        //cat.run();//run 方法就是一个普通的方法, 没有真正的启动一个线程，就会把run方法执行完毕，才向下执行
        //说明: 当main线程启动一个子线程 Thread-0, 主线程不会阻塞, 会继续执行
        //这时 主线程和子线程是交替执行..
        System.out.println("主线程继续执行" + Thread.currentThread().getName());//名字 main

        for (int i = 0; i < 60; i++) {
            System.out.println("主线程 i=" + i);
            // 让主线程休眠
            Thread.sleep(1000);
        }
    }
}

class Cat extends Thread {

    int times = 0;

    @Override
    public void run() { //重写run 方法，自定义业务逻辑

        while (true) {
            //该线程每隔1秒，在控制台输出"喵喵 我是小猫咪"
            System.out.println("喵喵 我是小猫咪" + (++times) + "线程名=" + Thread.currentThread().getName());
            //让该线程休眠1秒 ctrl + alt + t
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (times == 80) {
                break;
            }
        }
    }

}
